/**
 * 判断传入值是否为空，该函数对于空值的定义为：undefined、null、NaN、空字符串、空数组、空对象（包含可枚举属性的对象）、空函数（函数体没有任何代码）
 * @function isEmpty
 * @param {any} v 判断值
 * @returns {boolean} 是否为空
 */
export function isEmpty(v: any): boolean {
  switch (typeof v) {
    case "undefined": {
      return true;
    }
    case "string": {
      if (v.trim().length === 0) return true;
      return false;
    }
    case "number": {
      if (isNaN(v)) return true;
      return false;
    }
    case "object": {
      if (v === null) return true;
      if (Array.isArray(v)) return v.length === 0;
      if (v.constructor.name == "Date") return false;
      if (v.constructor.name == "Set") return v.size == 0;
      if (v.constructor.name == "Map") return v.size == 0;
      for (const k in v) return false;
      return true;
    }
    case "function": {
      const funcString = v.toString();
      const content = funcString
        .substr(funcString.indexOf(")"))
        .replace(/function|=>|[(){};]/g, "")
        .trim();
      if (content.length === 0) return true;
      return false;
    }
    default: {
      return false;
    }
  }
}
